package com.ahorresas.controllers;

import com.ahorresas.modelo.beans.PersonaBean;
import com.ahorresas.modelo.daos.PrestamoDao;
import com.ahorresas.modelo.beans.PrestamoBean;
import com.ahorresas.modelo.beans.VigenciaBean;
import com.ahorresas.modelo.daos.PersonaDao;
import com.ahorresas.modelo.daos.VigenciaDao;
import com.google.gson.Gson;
import java.io.IOException;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PrestamoController extends HttpServlet {
    
    private final PrestamoDao prestamoDao = new PrestamoDao();
    private String id_prestamo;
    private String cliente;
    private String fecha_prestamo;
    private String valor;
    private String cuotas;
    private String cuota_minima;
    private String vigencia;
    private String estado;
    private int resultado;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        /*Control del boton accionado desde la página JSP*/
        String accion = request.getParameter("accion");
        if(accion == null){
            accion = "";
        }
        
        java.util.Date fecha = new java.util.Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        
        id_prestamo = request.getParameter("id_prestamo");
        cliente = request.getParameter("cliente");
        fecha_prestamo = dateFormat.format(fecha);
        valor = request.getParameter("valor");
        cuotas = request.getParameter("cuotas");
        cuota_minima = request.getParameter("cuota_minima");
        vigencia = request.getParameter("vigencia");
        estado = request.getParameter("estado");
        
        PrestamoBean prestamo;
        String validacion;
        resultado = 0;
        
        switch (accion) {
            case "calcular":
                VigenciaBean vig = new VigenciaDao().buscarVigencia(Integer.valueOf(vigencia));
                calcularCuota(request, response, vig);
                break;
            case "consultar":
                validacion = obligatorios(false);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
                    prestamo = prestamoDao.buscarPrestamo(id_prestamo);
                    if(prestamo != null){
                        llenarCampos(request, prestamo);
                        request.setAttribute("msg", "El Préstamo fué encontrado con éxito");
                    }else{
                        request.setAttribute("msg", "El Préstamo no pudo ser encontrado");
                    }
                }
                request.getRequestDispatcher("./jsp/prestamo.jsp").forward(request, response);
                break;
            case "guardar":
                validacion = obligatorios(true);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
//                    prestamo = prestamoDao.buscarPrestamo(id_prestamo);
//                    if(prestamo != null){
//                        prestamo.setCliente(cliente);
//                        prestamo.setFechaPrestamo(Date.valueOf(fecha_prestamo));
//                        prestamo.setValor(Double.valueOf(valor));
//                        prestamo.setCuotas(Integer.valueOf(cuotas) );
//                        prestamo.setCuotaMinima(Double.valueOf(cuota_minima));
//                        prestamo.setVigencia(Integer.valueOf(vigencia));
//                        prestamo.setEstado(estado);
//
//                        resultado = prestamoDao.modificarPrestamo(prestamo);
//                    } else {
                        prestamo = new PrestamoBean();
                        prestamo.setCliente(cliente);
                        prestamo.setFechaPrestamo(Date.valueOf(fecha_prestamo));
                        prestamo.setValor(Double.valueOf(valor));
                        prestamo.setCuotas(Integer.valueOf(cuotas) );
                        prestamo.setCuotaMinima(Double.valueOf(cuota_minima));
                        prestamo.setVigencia(Integer.valueOf(vigencia));
                        prestamo.setEstado(estado);

                        resultado = prestamoDao.crearPrestamo(prestamo);
                    
                    if(resultado != 0){
                        llenarCampos(request, null);
                        request.setAttribute("msg", "El préstamo fué guardado con éxito.");
                    } else {
                        request.setAttribute("msg", "El préstamo no pudo ser guardado.");
                    }
                }
                request.getRequestDispatcher("./jsp/prestamo.jsp").forward(request, response);
                break;
            case "eliminar":
                validacion = obligatorios(false);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
                    resultado = prestamoDao.eliminarPrestamo(Integer.valueOf(id_prestamo));
                    if(resultado == 1){
                        llenarCampos(request, null);
                        request.setAttribute("msg", "El préstamo fué eliminado con éxito");
                    } else {
                        request.setAttribute("msg", "El préstamo no pudo ser eliminado.");
                    }
                }
                request.getRequestDispatcher("./jsp/prestamo.jsp").forward(request, response);
                break;
            case "listar":
                List<PrestamoBean> listaPrestamos = prestamoDao.listarPrestamos();
                request.setAttribute("lista", listaPrestamos);
                request.getRequestDispatcher("./jsp/prestamo.jsp").forward(request, response);
                break;
            default:
                request.setAttribute("fecha_prestamo", fecha_prestamo);
                request.getRequestDispatcher("./jsp/prestamo.jsp").forward(request, response);
                break;
        }
    }
    
    public String obligatorios(boolean guardado){
        StringBuilder validacion = new StringBuilder();
//        if(id_prestamo == null || id_prestamo.equals("")){
//            validacion.append("El campo 'Código de préstamo' no debe estar vacío. <br>");
//        } else {
//            try {
//                Integer.valueOf(id_prestamo);
//            } catch (NumberFormatException e) {
//                validacion.append("El campo 'Código de préstamo' debe ser numérico. <br>");
//            }
//        }

        /* Si es guardado de datos valida los demás campos de lo contrario 
         * retorna la validación sobre el clave 
         */
        if(!guardado) {
            return validacion.toString();
        }
        
        if(cliente == null || cliente.equals("0")){
            validacion.append("Debe seleccionar una de las opciones de 'Cliente'. <br>");
        } else {
            PersonaBean cli = new PersonaDao().buscarPersona(cliente);
            if(cli == null){
                validacion.append("El cliente no está registrado en el sistema. <br>");
            }
        }
        
        if(fecha_prestamo == null || fecha_prestamo.equals("")){
            validacion.append("El campo 'Fecha de préstamo' no debe estar vacío. <br>");
        } else {
            try {
                Date.valueOf(fecha_prestamo);
            } catch (Exception e) {
                validacion.append("La fecha no se ecuentra en un formato válido. <br>");
            }
        }
        if(valor == null || valor.equals("")){
            validacion.append("El campo 'Valor' no debe estar vacío. <br>");
        } else {
            try {
                Long.valueOf(valor);
            } catch (NumberFormatException e) {
                validacion.append("El campo 'Valor' es numérico. <br>");
            }
        }
        if(cuotas == null || cuotas.equals("")){
            validacion.append("El campo 'Cuotas' no debe estar vacío. <br>");
        } else {
            try {
                Integer.valueOf(cuotas);
            } catch (NumberFormatException e) {
                validacion.append("El campo 'Cuotas' es numérico. <br>");
            }
        }
        if(cuota_minima == null || cuota_minima.equals("")){
            validacion.append("El campo 'Cuota mínima' no debe estar vacío. <br>");
        } else {
            try {
                Double.valueOf(cuota_minima);
            } catch (NumberFormatException e) {
                validacion.append("El campo 'Cuota mínima' es numérico. <br>");
            }
        }
        if(vigencia == null || vigencia.equals("")){
            validacion.append("El campo 'Vigencia' no debe estar vacío. <br>");
        }
        if(estado == null || estado.equals("")){
            validacion.append("El campo 'Estado' no debe estar vacío. <br>");
        }
        return validacion.toString();
    }
    
    public void llenarCampos(HttpServletRequest request, PrestamoBean prestamo){
        request.setAttribute("id_prestamo", prestamo != null ? prestamo.getIdPrestamo() : "");
        request.setAttribute("cliente", prestamo != null ? prestamo.getCliente() : "");
        request.setAttribute("fecha_prestamo", prestamo != null ? prestamo.getFechaPrestamo() : "");
        request.setAttribute("valor", prestamo != null ? prestamo.getValor() : "");
        request.setAttribute("cuotas", prestamo != null ? prestamo.getCuotas() : "");
        request.setAttribute("cuota_minima", prestamo != null ? prestamo.getCuotaMinima() : "");
        request.setAttribute("vigencia", prestamo != null ? prestamo.getVigencia() : "");
        request.setAttribute("estado", prestamo != null ? prestamo.getEstado() : "");
    }
    
    public void mantenerDatos(HttpServletRequest request){
        request.setAttribute("id_prestamo", id_prestamo != null ? id_prestamo : "");
        request.setAttribute("cliente", cliente != null ? cliente : "");
        request.setAttribute("fecha_prestamo", fecha_prestamo != null ? fecha_prestamo : "");
        request.setAttribute("valor", valor != null ? valor : "");
        request.setAttribute("cuotas", cuotas != null ? cuotas : "");
        request.setAttribute("cuota_minima", cuota_minima != null ? cuota_minima : "");
        request.setAttribute("vigencia", vigencia != null ? vigencia : "");
        request.setAttribute("estado", estado != null ? estado : "");
    }
    
    public void calcularCuota(HttpServletRequest request, HttpServletResponse response, VigenciaBean vig){
        Map<String, String> result = new HashMap();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        try {
            Double val = Double.valueOf(valor);
            int cuo = Integer.valueOf(cuotas);
            if(vig != null){
                Double valorCuota = (val / cuo) * (1 + vig.getPorcentajeDeuda());
                valorCuota = Math.rint(valorCuota*1)/1;
                result.put("resultado", "ok");
                result.put("valor", valorCuota.toString());
                String json = new Gson().toJson(result);
                response.getWriter().write(json);
            } else {
                result.put("resultado", "error");
                result.put("mensaje", "No se pudo encontrar la vigencia");
                String json = new Gson().toJson(result);
                response.getWriter().write(json);
            }
        } catch (IOException e) {
            try {
                result.put("resultado", "error");
                result.put("mensaje", "El documento del empleado no es numérico");
                String json = new Gson().toJson(result);
                response.getWriter().write(json);
                System.out.println(e.getMessage()+" "+e.getStackTrace());
            } catch (IOException ex) {
                System.out.println(e.getMessage()+" "+e.getStackTrace());
            }
        }
    }
}
